package visual.texto;

import negocios.FacadeNegocios;
import negocios.Usuario;
import negocios.excecoes.EntradaInvalidaException;
import negocios.excecoes.LocalizacaoException;
import negocios.excecoes.NaoEncontradoException;
import negocios.excecoes.SessaoInexistenteException;
import util.Criptografia;

/**
 * Classe que implementa um Menu com o usuario, para manipulacao de suas
 * funcionalidades, tais quais acessar caixa postal, atualizar informacoes,
 * gerenciar amigos, etc
 * 
 * @author Jonathan Brilhante
 * @author Jose Rafael
 * @author Nata Venancio
 * @author Renato Almeida
 * 
 * @version 2.0
 */

public class MenuUsuario extends MenuTexto {
	// constantes do menu de usuario
	private static final int ACESSAR_CAIXA = 1;
	private static final int ATUALIZAR_INFO = 2;
	private static final int DELETAR_CONTA = 3;
	private static final int GERENCIAR_AMIGOS = 4;
	private static final int VOLTAR = 5;

	// constantes de atualizar informacoes
	private static final int SENHA = 1;
	private static final int NOME = 2;
	private static final int EMAIL = 3;
	private static final int TELEFONE = 4;

	private static final String LOGADO = "1 - Acessar a Caixa Postal" + SEP
			+ "2 - Atualizar Informacoes" + SEP + "3 - Deletar Conta" + SEP
			+ "4 - Gerenciar Amigos" + SEP + "5 - Deslogar" + SEP;
	private static final String IMPOSSIVEL = "Impossivel atualizar o campo requisitado";

	private String login;

	/**
	 * Constroi um menu com usuarios a partir de um usuario
	 * 
	 * @param login
	 *            o login usuario
	 */
	public MenuUsuario(String login) {
		this.login = login;
	}

	/**
	 * Metodo auxiliar para deletar a conta do usuario
	 */
	private void deletar() {
		System.out
				.println("Para efetuar a exclusao da conta, digite o login e senha.");
		System.out.println("Login : ");
		String login = entrada.leLinha();
		System.out.println("Senha : ");
		String senha = entrada.leLinha();
		try {
			FacadeNegocios.getInstance().deletarUsuario(login, senha);
		} catch (NaoEncontradoException e) {
			System.err.println(e.getMessage());
		}
	}

	/**
	 * Metodo auxiliar para atualizar a conta do usuario
	 */
	private void atualizar(Usuario usuario) {
		System.out.println("Seus dados atuais sao: ");
		System.out.println("Login : " + usuario.getLogin());
		System.out.println("1 - Senha : "
				+ Criptografia.decifra(usuario.getSenha()));
		System.out.println("2 - Nome : " + usuario.getNome());
		System.out.println("3 - Email : " + usuario.getEmail());
		System.out.println("4 - Telefone : " + usuario.getTelefone());
		System.out.println("Escolha a opcao que deseja atualizar da sua conta."
				+ SEP);

		int escolha = getEntradaValida(SENHA, TELEFONE);
		if (escolha == INVALIDA) {
			return;
		}

		switch (escolha) {
		case NOME:
			System.out.println("Novo nome: ");
			try {
				usuario.setNome(entrada.leLinha());
			} catch (EntradaInvalidaException e) {
				System.err.println(e.getMessage());
				System.err.println(IMPOSSIVEL);
			}
			break;

		case SENHA:
			System.out.println("Nova senha: ");
			try {
				usuario.setSenha(entrada.leLinha());
			} catch (EntradaInvalidaException e) {
				System.err.println(e.getMessage());
				System.err.println(IMPOSSIVEL);
			}
			break;

		case EMAIL:
			System.out.println("Novo email: ");
			try {
				usuario.setEmail(entrada.leLinha());
			} catch (EntradaInvalidaException e) {
				System.err.println(e.getMessage());
				System.err.println(IMPOSSIVEL);
			}
			break;

		case TELEFONE:
			System.out.println("Novo telefone: ");
			String novoTel = entrada.leLinha();
			try {
				usuario.setTelefone(novoTel);
			} catch (EntradaInvalidaException e) {
				System.err.println(e.getMessage());
				System.err.println(IMPOSSIVEL);
			}
			break;
		}
	}

	public void executa() {
		Usuario usuario;
		try {
			usuario = FacadeNegocios.getInstance().buscaPorLogin(login);
		} catch (NaoEncontradoException e1) {
			System.err.println(e1.getMessage());
			return;
		}
		System.out.println("Bem vindo, " + usuario.getNome() + ", voce tem: "
				+ usuario.getCaixaPostal().numeroDeMensagens() + " mensagens"
				+ SEP);
		System.out.println("Sua localizacao: ");
		try {
			System.out.println(usuario.localizacao());
		} catch (LocalizacaoException e) {
			System.err.println(e.getMessage());
		}
		System.out.println();

		boolean controlador = true;

		while (controlador) {
			System.out.println(LOGADO);

			int escolha = getEntradaValida(ACESSAR_CAIXA, VOLTAR);
			if (escolha == INVALIDA) {
				continue;
			}

			switch (escolha) {

			case ACESSAR_CAIXA:
				new MenuCaixaPostal(login).executa();
				break;

			case ATUALIZAR_INFO:
				atualizar(usuario);
				break;

			case DELETAR_CONTA:
				deletar();
				controlador = false;
				break;

			case GERENCIAR_AMIGOS:
				new MenuAmigos(login).executa();
				break;

			case VOLTAR:
				try {
					FacadeNegocios.getInstance().deslogar(login);
				} catch (SessaoInexistenteException e) {
					System.err.println(e.getMessage());
				}
				controlador = false;
				break;
			}
		}
	}
}